import {MediaFitOption, MediaFitReturn} from './interface'
/**
 * 数字化
 * @param n 
 * @param def 
 * @returns 
 */
export function num(n:number, def:number = 0):number{
    n = Number(n)
    return isNaN(n) ? def : n
}
/**
 * 正数化
 * @param n 
 * @param def 
 * @returns 
 */
export function abs(n:number, def:number = 0):number{
    n = Math.abs(n)
    return isNaN(n) ? def : n
}
/**
 * 适配计算，类似css3的object-fit
 * @param opt 
 * @param opt.boxWidth 盒子宽
 * @param opt.boxHeight 盒子高
 * @param opt.mediaWidth 媒体原始宽
 * @param opt.mediaHeight 媒体原始高
 * @param opt.maxWidth 最大允许宽，只有mode=limit时有效
 * @param opt.maxHeight 最大允许高，只有mode=limit时有效
 * @param opt.mode 适配模式，可选值有 none|fill|limit|cover|contain，默认为none。
 *  none: 保持媒体原始宽高，对齐盒子左上角
 *  fill: 将媒体拉伸匹配盒子宽高
 *  limit: 等比缩放，将媒体限制在maxWidth和maxHeight的范围内，并居中，是否发生裁剪取决于maxWidth和maxHeight
 *  cover: 等比缩放，使媒体短边匹配盒子，并居中长边裁剪
 *  contain: 等比缩放，使媒体长边匹配盒子，并居中
 *  autoWidth: 等比缩放，使媒体高度填满盒子，宽度保持原始比例自动缩放，居左
 *  autoHeight: 等比缩放，使媒体宽度填满盒子，高度保持原始比例自动缩放，居左
 * @returns 
 */
export function objectFit(opt:MediaFitOption): MediaFitReturn{
    if(!opt || !opt.mediaWidth || opt.mediaWidth <= 0 || !opt.mediaHeight || opt.mediaHeight <= 0 || !opt.boxWidth || opt.boxWidth <= 0 || !opt.boxHeight || opt.boxHeight <= 0) return null
    let res:MediaFitReturn = {
        mediaX: 0,
        mediaY: 0,
        mediaWidth: opt.mediaWidth,
        mediaHeight: opt.mediaHeight,
        mediaOriginWidth: opt.mediaWidth,
        mediaOriginHeight: opt.mediaHeight
    }
    if(opt.mode === 'fill'){
        res.mediaWidth = opt.boxWidth
        res.mediaHeight = opt.boxHeight
        return res
    }
    if(opt.mode === 'autoWidth'){
        res.mediaHeight = opt.boxHeight
        res.mediaWidth = Math.round(opt.boxHeight * opt.mediaWidth/opt.mediaHeight)
        return res
    }
    if(opt.mode === 'autoHeight'){
        res.mediaWidth = opt.boxWidth
        res.mediaHeight = Math.round(opt.boxWidth * opt.mediaHeight / opt.mediaWidth)
        return res
    }
    if(opt.mode === 'limit'){
        if(!opt.maxWidth || opt.maxWidth <= 0 || !opt.maxHeight || opt.maxHeight <= 0) return null
        // 先把media宽度缩放到允许的最大值maxWidth，得出等比缩放的mediaHeight
        res.mediaWidth = opt.maxWidth
        res.mediaHeight = Math.round(opt.maxWidth * opt.mediaHeight / opt.mediaWidth)
        // 此时，如果res.mediaHeight超过了允许的最大值maxHeight，则转为缩放高度为maxHeight，再调试宽度
        if(res.mediaHeight > opt.maxHeight){
            res.mediaHeight = opt.maxHeight
            res.mediaWidth = Math.round(opt.maxHeight * opt.mediaWidth / opt.mediaHeight)
        }
        res.mediaX = Math.round((opt.boxWidth - res.mediaWidth) / 2)
        res.mediaY = Math.round((opt.boxHeight - res.mediaHeight) / 2)
        return res
    }
    if(opt.mode === 'cover' || opt.mode === 'contain'){
        // 先把media宽度缩放与box同宽，得出等比缩放的mediaHeight
        res.mediaWidth = opt.boxWidth
        res.mediaHeight = Math.round(opt.boxWidth * opt.mediaHeight / opt.mediaWidth)
        res.mediaX = 0
        res.mediaY = Math.round((opt.boxHeight - res.mediaHeight) / 2)
        if(opt.mode === 'cover'){
            // 此时，如果res.mediaHeight未超过boxHeight，则转为缩放高度同高，再调试宽度
            if(res.mediaHeight < opt.boxHeight){
                res.mediaHeight = opt.boxHeight
                res.mediaWidth = Math.round(opt.boxHeight * opt.mediaWidth / opt.mediaHeight)
                res.mediaX = Math.round((opt.boxWidth - res.mediaWidth) / 2)
                res.mediaY = 0
            }
            return res
        }
        if(opt.mode === 'contain'){
            // 此时，如果res.mediaHeight超过boxHeight，则转为缩放高度同高，再调宽度
            if(res.mediaHeight > opt.boxHeight){
                res.mediaHeight = opt.boxHeight
                res.mediaWidth = Math.round(opt.boxHeight * opt.mediaWidth / opt.mediaHeight)
                res.mediaX = Math.round((opt.boxWidth - res.mediaWidth) / 2)
                res.mediaY = 0
            }
            return res
        }
    }
    return res
}